# 1、将对象定义为局部变量,当指定的函数执行完毕，则对象随着会被自动销毁
class Animal(object):
    def __init__(self):
        print("init构造器被调用了")

    def __del__(self):
        print("del析构器被调用了")


def func():
    a = Animal()
    print("func函数执行完毕")


func()

print("程序执行完毕")


# 以上执行顺序：init构造器被调用了，func函数执行完毕，del析构器被调用了，程序执行完毕，


# 以下强制销毁对象，什么时候del对象，则什么时候执行析构函数 del()
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("init构造器被调用了")

    def __del__(self):
        print("del析构器被调用了")


p = Person("张三", 19)
print(p.name, p.age)
p.age = 20
p.name = "李四"
print(p.name, p.age)
del p
# print(p.name, p.age) 此处会报错，因为对象已经被销毁了
print("程序执行完毕")


# 以下特殊情况，操作私有属性，了解即可
class Phone:
    def __init__(self, brand, price):
        self.__brand = brand
        self.__price = price


p = Phone("小米", 1999)
# print(p.brand) 此处会报错，因为brand是私有属性，不能被访问
print(p._Phone__brand)  # 此处可以访问，但是不推荐。格式：对象名._类名.__私有属性名


class Clothes:
    def __init__(self, brand, price):
        self.__brand = brand
        self.__price = price

    def get_price(self):
        return self.__price

    def set_price(self, price):
        if price > 0:
            self.__price = price
        else:
            print("衣服价格不能小于0")

    def get_brand(self):
        return self.__brand

    def set_brand(self, brand):
        self.__brand = brand


print("*" * 50)
c = Clothes("耐克", 1999)
# print(c.get_price())
c.set_price(2000)
# 获取私有属性值并打印
print(c.get_price())
# 重置私有属性值
c.set_brand("adidas")
print(c.get_brand())


class Check(object):
    @property  # @property装饰器的作用：将一个方法变成属性调用，注意：加了注释的方法，建议加上返回值
    def show(self):
        return "我是一个展示方法"

    def pri(self):
        return "我是一个打印方法"


c = Check()
p = c.pri()
print(p)
print(c.show)
